# 三、数组的索引

import numpy as np

# # 3.1 访问数组元素
# # （1）访问向量
# arr1 = np.arange(3, 15, 3)
# print(arr1)
# print(arr1[2], arr1[3]) # 正着访问
# print(arr1[-2], arr1[-3]) # 倒着访问
# # （2）访问矩阵
# arr2 = np.array([[1,2,3], [4,5,6]])
# print(arr2)
# arr2[0,2]=100
# print(arr2)

# # 3.2 花式索引
# # 普通索引用一层中括号，花式索引用两层中括号。
# # （1）向量的花式索引
# arr1 = np.arange(0,90, 10)
# print(arr1)
# print(arr1[ [0, 2, 4] ]) # 0 2 4 号 组成新的向量
# # （2）矩阵的花式索引
# arr2 = np.arange(1,17).reshape(4,4)
# print(arr2)
# print(arr2[[0,2],[1,3]]) # 0 1  2 3  组成新的向量
# arr2[[0,1,2,3],[3,2,1,0]]=100# 修改数组元素
# print(arr2)



# # 3.3 访问数组切片

# # （1）向量的切片
# arr1 = np.arange(10)
# print(arr1)
# # 当明确知道从第 x 个元素切到第 y 个元素，如示例所示。
# print("从索引[2]开始，切到索引[5]之前", arr1[2 : 5])
# print("从索引[3]开始，切到结尾", arr1[3 :  ])
# print("从数组开头开始，切到索引[8]之前", arr1[ : 8])
# # 当明确切除数组的开头与结尾，如示例所示。
# print("切除开头 2 个和结尾 2 个" , arr1[2:-2])
# print("切除开头 2 个" , arr1[2:])
# print("切除结尾 2 个" , arr1[ :-2])
# # 当明确隔几个元素采样一次时，示例如下。
# print(" 每 3 个元素采样一次" , arr1[ : : 3])
# print("切除一头一尾后，每 2 个元素采样一次" , arr1[1: -1: 2])

# # （2）矩阵的切片
# arr2 = np.arange(1,31).reshape(5,6)
# print( arr2 )
# print(arr2[1:4, 1:-1]) # 去除头尾后的[1]-[3]行
# print(arr2[::3, ::2]) # 跳跃采样 行 0、3、6、9…… 列0、2、4、8……

# # （2_1）提取矩阵的行
# print(arr2[2, : ]) # 提取 [2] 行
# print(arr2[1:4, :]) # 提取 [1] 至 [3] 行
#  # 当提取矩阵的某几行时可不写列
# print(arr2[2]) # 提取 [2] 行
# print(arr2[1:4]) # 提取 [1] 至 [3] 行

# # （2_2）提取矩阵的列
# print(arr2[ : , 2]) # 提取 [2] 列（注意，只提取1列打印的是“行向量”）
# print(arr2[ : , 1:5]) # 提取 [1] 至 [5]（不含）列
# # 弄个“列向量”出来
# cut = arr2[ : , 2]
# cut=cut.reshape((-1, 1)) # 行的参数为-1代表，根据列的参数推导出行数
# print(cut)



# # 3.4 数组切片仅是视图
# # 换言之，NumPy 切片并不会创建新的变量
# # （1）数组切片仅是视图
# arr = np.arange(10) # 创建原数组 arr
# print(type(arr), arr)
# cut = arr[ : 3]
# print(type(cut), cut)
# cut[0] = 100 # 对切片的数值进行修改
# print(arr) # 原数组也被修改
# # （2）备份切片为新变量
# # 使用 .copy( ) 方法。
# copy = arr[: 3].copy()
# print("arr",arr)
# print("copy", copy)
# copy[0] = 55
# print("arr",arr)
# print("copy", copy)



# 3.5 数组赋值仅是绑定
# NumPy 数组之间的赋值并不会创建新的变量
# 如果真的需要赋给一个新数组，使用 .copy( ) 方法。
arr1 = np.arange(10) # 创建一个 0 到 10 的数组变量 arr
arr2 = arr1
arr3 = arr1.copy()

print("arr1", arr1)
print("arr2", arr2)
print("arr3", arr3)

arr2[2]=23
arr3[3]=45
print("arr1", arr1)
print("arr2", arr2)
print("arr3", arr3)

